package com.panshi.config;

/**
 * Created by tony on 2017/7/11.
 * <p>
 * JFinal 基础配置类目
 */

import com.alibaba.druid.filter.stat.StatFilter;
import com.alibaba.druid.wall.WallFilter;
import com.jfinal.config.*;
import com.jfinal.kit.PathKit;
import com.jfinal.kit.PropKit;
import com.jfinal.plugin.activerecord.ActiveRecordPlugin;
import com.jfinal.plugin.activerecord.CaseInsensitiveContainerFactory;
import com.jfinal.plugin.activerecord.dialect.MysqlDialect;
import com.jfinal.plugin.druid.DruidPlugin;
import com.jfinal.plugin.scheduler.SchedulerPlugin;
import com.jfinal.render.ViewType;
import com.jfinal.template.Engine;
import com.panshi.handler.DruidHandler;
import com.panshi.handler.WebSocketHandler;

public class MainConfig extends JFinalConfig {

    @Override
    public void configConstant(Constants me) {
        PropKit.use("config.properties");
        me.setViewType(ViewType.JSP);
        //设置默认的404页面
        me.setError404View("/WEB-INF/jsp/common/404.jsp");
        //设置默认的500页面
        me.setError500View("/WEB-INF/jsp/common/500.jsp");
        // 设置开发模式
        me.setDevMode(PropKit.getBoolean("devMode", false));

    }

    @Override
    public void configRoute(Routes me) {
        //接口路由
        me.add(new ApiRoutesConfig());

    }

    public void configEngine(Engine engine) {

    }

    @Override
    public void configPlugin(Plugins me) {

//		// 添加数据源C3P0
//		C3p0Plugin c3p0Plugin = new C3p0Plugin(PropKit.get("jdbcurl"), PropKit.get("user"), PropKit.get("password"));
//		//C3p0Plugin c3p0Plugin = new C3p0Plugin(PropKit.get("testjdbc"), PropKit.get("testuser"), PropKit.get("testpwd"));
//		me.add(c3p0Plugin);
//		// 添加orm映射
//		me.add(new ModelConfig(c3p0Plugin));


        /**
         * 关于Druid的更详细的配置
         *
         * @url https://github.com/alibaba/druid/wiki/DruidDataSource%E9%85%8D%E7%BD%AE%E5%B1%9E%E6%80%A7%E5%88%97%E8%A1%A8
         *
         * @author Tony
         *
         *
         * 2017/7/11.
         */
        ///--------基础数据源 -------
        //获取数据库链接基础信息
        DruidPlugin dp = new DruidPlugin(PropKit.get("jdbcurl"), PropKit.get("user"), PropKit.get("password"));
        //添加Druid提供的数据库性能监控
        dp.addFilter(new StatFilter());
        //初始化时建立物理连接的个数。初始化发生在显示调用init方法，或者第一次getConnection时
        dp.setInitialSize(10);
        //最大连接池数量
        dp.setMaxActive(100);
        //获取连接时最大等待时间，单位毫秒。配置了maxWait之后，缺省启用公平锁，并发效率会有所下降，如果需要可以通过配置useUnfairLock属性为true使用非公平锁。
        dp.setMaxWait(60000);
        //sql注入防火墙.开启保证安全
        WallFilter wall = new WallFilter();
        wall.setDbType("mysql");
        dp.addFilter(wall);
        me.add(dp);


        ///--------MT4 真实 数据源 -------
        //获取数据库链接基础信息
        DruidPlugin dp_mt4report_real = new DruidPlugin(PropKit.get("jdbcurl_mt4report_real"), PropKit.get("user_mt4report_real"), PropKit.get("password_mt4report_real"));
        //添加Druid提供的数据库性能监控
        dp_mt4report_real.addFilter(new StatFilter());
        //初始化时建立物理连接的个数。初始化发生在显示调用init方法，或者第一次getConnection时
        dp_mt4report_real.setInitialSize(10);
        //最大连接池数量
        dp_mt4report_real.setMaxActive(100);
        //获取连接时最大等待时间，单位毫秒。配置了maxWait之后，缺省启用公平锁，并发效率会有所下降，如果需要可以通过配置useUnfairLock属性为true使用非公平锁。
        dp_mt4report_real.setMaxWait(60000);
        //sql注入防火墙.开启保证安全
        WallFilter wall_mt4report_real = new WallFilter();
        wall_mt4report_real.setDbType("mysql");
        dp_mt4report_real.addFilter(wall_mt4report_real);
        me.add(dp_mt4report_real);


//        //-----------MT4 模拟 数据源-------------
//        //获取数据库链接基础信息
//        DruidPlugin dp_mt4report_demo = new DruidPlugin(PropKit.get("jdbcurl_mt4report_demo"), PropKit.get("user_mt4report_demo"), PropKit.get("password_mt4report_demo"));
//        //添加Druid提供的数据库性能监控
//        dp_mt4report_demo.addFilter(new StatFilter());
//        //初始化时建立物理连接的个数。初始化发生在显示调用init方法，或者第一次getConnection时
//        dp_mt4report_demo.setInitialSize(10);
//        //最大连接池数量
//        dp_mt4report_demo.setMaxActive(100);
//        //获取连接时最大等待时间，单位毫秒。配置了maxWait之后，缺省启用公平锁，并发效率会有所下降，如果需要可以通过配置useUnfairLock属性为true使用非公平锁。
//        dp_mt4report_demo.setMaxWait(60000);
//        //sql注入防火墙.开启保证安全
//        WallFilter wall_mt4report_demo = new WallFilter();
//        wall_mt4report_demo.setDbType("mysql");
//        dp_mt4report_demo.addFilter(wall_mt4report_demo);
//        me.add(dp_mt4report_demo);


        /**
         *
         * Jfinal内置动态数据集插件AR
         * 参见:https://my.oschina.net/zhuqianli/blog/823010  或者 Jfinal官方文档
         *
         * @author Tony
         * 2017/7/11.
         *
         */

        //-----------基础AR-------------
        ActiveRecordPlugin arp = new ActiveRecordPlugin(dp);
        //配置显示sql记录
        arp.setShowSql(true);
        //前置数据库方言
        arp.setDialect(new MysqlDialect());
        //配置属性名(字段名)大小写不敏感工厂
        arp.setContainerFactory(new CaseInsensitiveContainerFactory());
        //ActiveRecordPlugin 中使用 sql 管理功能
        // arp.setBaseSqlTemplatePath(PathKit.getRootClassPath());
        // arp.addSqlTemplate("sql.properties");
        me.add(arp);


        //-----------MT4 真实 AR-------------
        ActiveRecordPlugin arp_mt4report_real = new ActiveRecordPlugin("mt4report_real", dp_mt4report_real);
        //配置显示sql记录
        arp_mt4report_real.setShowSql(true);
        //前置数据库方言
        arp_mt4report_real.setDialect(new MysqlDialect());
        //配置属性名(字段名)大小写不敏感工厂
        arp_mt4report_real.setContainerFactory(new CaseInsensitiveContainerFactory());
        //ActiveRecordPlugin 中使用 sql 管理功能
        // arp.setBaseSqlTemplatePath(PathKit.getRootClassPath());
        // arp.addSqlTemplate("sql.properties");
        me.add(arp_mt4report_real);


//        //-----------MT4 模拟 AR-------------
//        ActiveRecordPlugin arp_mt4report_demo = new ActiveRecordPlugin("mt4report_demo", dp_mt4report_demo);
//        //配置显示sql记录
//        arp_mt4report_demo.setShowSql(true);
//        //前置数据库方言
//        arp_mt4report_demo.setDialect(new MysqlDialect());
//        //配置属性名(字段名)大小写不敏感工厂
//        arp_mt4report_demo.setContainerFactory(new CaseInsensitiveContainerFactory());
//        //ActiveRecordPlugin 中使用 sql 管理功能
//        // arp.setBaseSqlTemplatePath(PathKit.getRootClassPath());
//        // arp.addSqlTemplate("sql.properties");
//        me.add(arp_mt4report_demo);
//

        /**
         * jfinal-scheduler插件

         基于cron4j以及ScheduledThreadPoolExecutor实现的简单任务调度插件

         插件启用方式(采用builder模式构建)：

         https://git.oschina.net/myaniu/jfinal-scheduler

         */
        SchedulerPlugin schedulerPlugin = SchedulerPlugin.builder()
                .scheduledThreadPoolSize(10)
//                .enableAnnotationScan("com.panshi.job")
                .enableConfigFile("job.properties")
                .build();
        me.add(schedulerPlugin);


//        /**
//         * 多数据源配置示例
//         */
        //MT4数据服务-live
//
//        DruidPlugin dp2 = new DruidPlugin(PropKit.get("jdbcurl2"), PropKit.get("user2"), PropKit.get("password2"));
//        dp2.addFilter(new StatFilter());
//		WallFilter wall2 = new WallFilter();
//		wall2.setDbType("mysql");
//		dp2.addFilter(wall2);
//        me.add(dp2);
//
//        ActiveRecordPlugin arp2 = new ActiveRecordPlugin("mt4",dp2);
//        arp2.setShowSql(true);
//        me.add(arp2);


        //MT4数据服务-training
//
//        DruidPlugin dp3 = new DruidPlugin(PropKit.get("jdbcurl3"), PropKit.get("user3"), PropKit.get("password3"));
//        dp3.addFilter(new StatFilter());
//		WallFilter wall3 = new WallFilter();
//		wall3.setDbType("mysql");
//		dp3.addFilter(wall3);
//        me.add(dp3);
//
//        ActiveRecordPlugin arp3 = new ActiveRecordPlugin("mt4_train",dp3);
//        arp3.setShowSql(true);
//        me.add(arp3);


//        /**
//         * Jifna-event监听插件
//         */

//        EventPlugin eventPlugin=new EventPlugin();
//        eventPlugin.async();
//
//        // 设置扫描jar包，默认不扫描
//        eventPlugin.scanJar();
//        // 设置监听器默认包，默认全扫描
//        eventPlugin.scanPackage("com.symfx");
//        eventPlugin.start();
//        //添加到全局plugin中
//        me.add(eventPlugin);


//        /**
//         * 定时任务调度器
//         */
////
//		SchedulerPlugin sp = new SchedulerPlugin();
//		Runnable task = new TestJob();
//		// 每隔10秒执行一次
//		// sp.fixedDelaySchedule(task, 1000);
//		sp.fixedRateSchedule(task, 10000);
//		// 每隔1分钟执行一次
//		sp.cronSchedule(task, "* * * * *");
//		me.add(sp);


//        /**
//         * 自动生成Model的插件
//         */
//        //配置自動生成Model的插件
//        if (PropKit.getBoolean("autoUpdateModel")) {
//            me.add(new AutoModelPlugin(PropKit.get("jdbcurl"),PropKit.get("user"), PropKit.get("password").trim(),
//                    PropKit.get("modelPackage"), "",PropKit.get("saveModelPath")));
//        }


//        QuartzPlugin quartzPlugin = new QuartzPlugin("quartz_config.properties");
//        me.add(quartzPlugin);
//        JobBean job = new JobBean();
//        job.setJobClass("com.momoda.quartz.DakeTaskJob");
//        job.setCronExpression(FormaterCronExpression.formaterCronExpression(task.getStr("closingTime")));
//        job.setJobGroup("DakeTaskJob");
//        job.setJobDesc("DakeTaskJob_" + taskid);
//        QuartzPlugin.addJob(job);

    }

    @Override
    public void configInterceptor(Interceptors me) {

        // 添加日志全局拦截器
        // me.add(new ExceptionIntoLogInterceptor());

    }

    @Override
    public void configHandler(Handlers me) {

        //WebSocket 路由过滤器,将WebSocket的路由免于被系统处理
        me.add(new WebSocketHandler());

        //Druid 路由过滤器,将WebSocket的路由免于被系统处理
        me.add(new DruidHandler());

    }
//
//    /**
//     * 使用内置的Jetty启动本项目
//     *
//     * @param args
//     */
//    public static void main(String[] args) {
//        JFinal.start("WebRoot", 8090, "/", 5);
//    }

}
